/**axios封装
 * 请求拦截、相应拦截、错误统一处理
 */
import axios from 'axios'
import QS from 'qs'

import { Toast } from 'vant'
// import store from '@/store'
import { baseUrl } from '@/config'

console.log(baseUrl)

const request = axios.create({
  baseURL: baseUrl, // 环境的切换
  timeout: 10 * 1000 // Timeout 请求超时时间
  // withCredentials: true // 允许跨域携带cookie信息
})

// post请求头
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

// 请求拦截器
request.interceptors.request.use(
  config => {
    //添加加载loading
    Toast.loading({
      message: '加载中...',
      forbidClick: true,
      duration: 0
    })
    // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
    // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断

    // let token = store.state.token;            //获取存在vuex中的token
    let token = localStorage.getItem('token') //获取存储在localStorage中的token
    if (token) {
      config.headers.authorization = 'Bearer ' + token
    }
    return config
  },
  error => {
    return Promise.error(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  response => {
    Toast.clear()
    const res = response.data
    if (res.status && res.status !== 200) {
      switch (
      res.status // 401: 未登录 // 未登录则跳转登录页面，并携带当前页面的路径 // 在登录成功后返回当前页面，这一步需要在登录页操作。
      ) {
        case 401:
          Toast({
            message: '未登录，请先登录',
            duration: 1000,
            forbidClick: true
          })
          break
        case 403:
          Toast({
            message: '登录过期，请重新登录',
            duration: 1000,
            forbidClick: true
          })
          localStorage.removeItem('token') // 清除token
          break
        case 404:
          Toast({
            message: '网络请求不存在',
            duration: 1500,
            forbidClick: true
          })
          break
        default:
          // 其他错误，直接抛出错误提示
          Toast({
            message: error.response.data.message,
            duration: 1500,
            forbidClick: true
          })
      }
      return Promise.reject(res || 'error')
    } else {
      return Promise.resolve(res)
    }
  },
  // 服务器状态码不是200的情况
  error => {
    Toast.clear()
    Toast({
      message: '加载失败!',
      duration: 1000,
      forbidClick: true
    })
    console.log('err' + error)
    return Promise.reject(error)
  }
)

export default {
  /**
   * get方法，对应get请求
   * @param {String} url [请求的url地址]
   * @param {Object} params [请求时携带的参数]
   */
  get(url, data) {
    let params = data || ''
    return new Promise((resolve, reject) => {
      request
        .get(url, params)
        .then(res => {
          resolve(res.data)
        })
        .catch(err => {
          reject(err.data)
        })
    })
  },

  /**
   * post方法，对应post请求
   * @param {String} url [请求的url地址]
   * @param {Object} params [请求时携带的参数]
   */
  post(url, data) {
    let params = data || ''
    return new Promise((resolve, reject) => {
      request
        .post(url, QS.stringify(params))
        .then(res => {
          resolve(res.data)
        })
        .catch(err => {
          reject(err.data)
        })
    })
  },
  /**
   * upload方法，对应upload请求
   * @param {String} url [请求的url地址]
   * @param {Object} params [请求时携带的参数]
   */
  upload(url, data) {
    let params = data || ''
    return new Promise((resolve, reject) => {
      request
        .upload(url,params)
        .then(res => {
          resolve(res.data)
        })
        .catch(err => {
          reject(err.data)
        })
    })
  },

  /**
   * download方法，对应download请求
   * @param {String} url [请求的url地址]
   * @param {Object} params [请求时携带的参数]
   */
  download(url, data) {
    let params = data || ''
    return new Promise((resolve, reject) => {
      request
        .download(url,params)
        .then(res => {
          resolve(res.data)
        })
        .catch(err => {
          reject(err.data)
        })
    })
  },
  /**
   * put方法，对应put请求
   * @param {String} url [请求的url地址]
   * @param {Object} params [请求时携带的参数]
   */
  put(url, data) {
    let params = data || ''
    return new Promise((resolve, reject) => {
      request
        .put(url,params)
        .then(res => {
          resolve(res.data)
        })
        .catch(err => {
          reject(err.data)
        })
    })
  },
  /**
   * delete方法，对应delete请求
   * @param {String} url [请求的url地址]
   * @param {Object} params [请求时携带的参数]
   */
  delete(url, data) {
    let params = data || ''
    return new Promise((resolve, reject) => {
      request
        .delete(url,params)
        .then(res => {
          resolve(res.data)
        })
        .catch(err => {
          reject(err.data)
        })
    })
  }
}
